package com.wugui.datax.rpc.remoting.invoker.route.impl;

import java.util.Random;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import com.wugui.datax.rpc.remoting.invoker.route.XxlRpcLoadBalance;

/**
 * round
 *
 * @author xuxueli 2018-12-04
 */
public class XxlRpcLoadBalanceRoundStrategy extends XxlRpcLoadBalance {

	private ConcurrentMap<String, Integer> routeCountEachJob = new ConcurrentHashMap<String, Integer>();
	private long CACHE_VALID_TIME = 0;

	private int count(String serviceKey) {
		// cache clear
		if (System.currentTimeMillis() > CACHE_VALID_TIME) {
			routeCountEachJob.clear();
			CACHE_VALID_TIME = System.currentTimeMillis() + 24 * 60 * 60 * 1000;
		}

		// count++
		Integer count = routeCountEachJob.get(serviceKey);
		count = (count == null || count > 1000000) ? (new Random().nextInt(100)) : ++count; // 初始化时主动Random一次，缓解首次压力
		routeCountEachJob.put(serviceKey, count);
		return count;
	}

	@Override
	public String route(String serviceKey, TreeSet<String> addressSet) {
		// arr
		String[] addressArr = addressSet.toArray(new String[addressSet.size()]);

		// round
		String finalAddress = addressArr[count(serviceKey) % addressArr.length];
		return finalAddress;
	}

}
